package com.iot.service.mqtt.service.rel;

import com.iot.service.mqtt.model.request.TlMqttPubRelReq;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * @Author: hszhou
 * @Date: 2025/4/18 14:45
 * @Description: 必须描述类做什么事情, 实现什么功能
 */
public interface IPubrelStoreService {

    /**
     * 保存订阅者的某个rel的消息
     * 当broker向订阅者推送rel的消息时，需要将这个消息保存起来防止没收到comp的消息时重发
     *
     * @param clientId  订阅者的客户端ID
     * @param messageId 消息ID
     * @param req       具体的消息
     * @return 是否保存成功
     */
    Mono<Boolean> savePubRelMessage(String clientId, Long messageId, TlMqttPubRelReq req);

    /**
     * 清除订阅者的某个rel的消息
     *
     * @param clientId  订阅者的客户端ID
     * @param messageId 消息
     * @return 是否保存成功
     */
    Mono<TlMqttPubRelReq> clearPubRelMessage(String clientId, Long messageId);

    /**
     * 清除订阅者的所有rel的消息
     *
     * @param clientId 订阅者的Rel消息
     * @return 是否清除成功
     */
    Mono<Boolean> clearPubRelMessage(String clientId);

    /**
     * 查找订阅者的某个rel消息
     *
     * @param clientId  订阅者的客户端ID
     * @param messageId 消息id
     * @return 具体的消息
     */
    Mono<TlMqttPubRelReq> findPubRelMessage(String clientId, Long messageId);

    /**
     * 查找订阅者的所有rel消息
     *
     * @param clientId 客户端的ID
     * @return 消息列表
     */
    Flux<TlMqttPubRelReq> findPubRelMessage(String clientId);

}
